//vm，虚拟机模块 主要用来创建运行环境
let vm = require('vm');

//想让字符串执行，有几种方法

/** 1) eval 这种方式能访问到字符串外面定义的变量*/
/*let a = 1;
eval(`console.log(a)`); //1*/
//
//可以用`()`包起来，返回一个函数
/*let x = eval(`(function(a,b){return a+b;})`)
console.log(x);
console.log(x(1, 1));*/

/** 2) new Function*/
//下面的例子会报错, 报找不到c, 说明new Function隔绝了上下文
/*let c= 'c'
let fn = new Function('a', 'b', 'console.log(c);return a+b;');
console.log(fn(1, 2));*/
//虽然能隔绝作用域，但我们require('/a') -> 会直接执行读取到的函数
//new Function的话不能直接执行 需要new Function()()

/** 3) */
let hello = 'xxx';
vm.runInThisContext('console.log(hello)'); //ReferenceError: hello is not defined
//
//可以用`()`包起来，返回一个函数
/*let fn = vm.runInThisContext('(function(a,b){return a+b;})');
console.log(fn); //[Function (anonymous)]
console.log(fn(1, 1)); //2*/
